extends Sprite2D

## 乒乓球游戏

## 游戏规则
# 1.玩家控制上下键盘来控制面板
# 2.电脑玩家自动控制另一个面板
# 3.如果小球碰到面板和墙壁可以反弹
# 4.如果球落入桌面以外算该球丢失，另一方得分

## 设计逻辑
# 1.游戏开始，触发初始化
# 2.玩家滑板的移动
# 	2.1 通过每帧中，监听键盘输入事件，来控制滑板移动
#	2.2 滑板不能超出上下边界
# 3.机器人滑板的移动
# 	3.1 通过每帧中，查看小球当前时刻的 y 值进而来控制机器人滑板的移动
# 	3.2 每帧中，当前时刻的小球的 y 如果是在滑板长度范围内，滑板也需要移动，因为滑板目标是正中心 position 碰撞到它
#	3.2 滑板不能超出上下边界
# 4.小球每帧检测碰撞
#	4.1 小球碰撞墙壁，直接反弹
# 	4.2 小球碰撞滑板
#		4.2.1 小球反弹
#		4.2.2 小球获得加速度，由滑板移动带来的。由于滑板是 StaticBody，碰撞时速度本应该为 0 这是因为通过 position 控制其运动，因此需要额外保存速度，方便碰撞时小球能识别出来当前滑板的速度
# 5.得分，信号检测

var score := [0, 0] # 0: Player, 1: 机器人

@onready var ball: CharacterBody2D = $Ball
@onready var player: StaticBody2D = $Player
@onready var robot_player: StaticBody2D = $RobotPlayer
@onready var robot_player_score: Label = $Hud/RobotPlayerScore
@onready var ball_timer: Timer = $BallTimer

## 当计时器 timeout 触发
func _on_ball_timer_timeout():
	player.init_paddle()
	robot_player.init_paddle()
	ball.new_ball() # 调用，生成 1 个新球

## 当小球出左侧区域
func _on_score_left_body_entered(body):
	score[1] += 1 # 右侧得分
	robot_player_score.text = str(score[1])
	ball_timer.start() # 计时开始（本质等待 1s）

## 当小球出右侧区域
func _on_score_right_body_entered(body):
	score[0] += 1 # 左侧得分
	robot_player_score.text = str(score[0])
	ball_timer.start() # 计时开始（本质等待 1s）
